package hrx.service;

import hrx.dao.AdminDao;
import hrx.dao.RelationDao;
import hrx.dao.TaskDao;
import hrx.dao.UserDao;
import hrx.entity.Admin;
import hrx.entity.Relation;
import hrx.entity.Task;
import hrx.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

@Service
public class AdminService {

    @Autowired
    private AdminDao adminDao;

    @Autowired
    private XsdService xsdService;

    @Autowired
    private TaskDao taskDao;

    @Autowired
    private UserDao userDao;

    @Autowired
    private RelationDao relationDao;

    /**
     * 注册用户
     *
     * @param admin
     */
    public void saveAdmin(Admin admin) {
        adminDao.save(admin);
    }

    /**
     * 登录验证
     *
     * @param admin
     */
    public Admin findByName(Admin admin) {
        Optional<Admin> byName = adminDao.findByName(admin.getName());
        if (byName.isPresent()) {
            return byName.get();
        }else {
            return null;
        }
    }

        /**
     * 查询所有任务
     *
     * @return
     */
    public List<Task> findAllTasks() {
        return taskDao.findAll();
    }

        /**
     * 查询任务
     *
     * @param id
     * @return
     */
    public Task findTaskById(Integer id) {
        Optional<Task> taskOptional = taskDao.findById(id);
        if (taskOptional.isPresent()) {
            return (Task) taskOptional.get();
        } else {
            return null;
        }
    }

        /**
     * 根据user_id查询对应的user
     * @param user_id
     * @return
     */
    public User findByUser_id(Integer user_id) {
        Optional<User> byId = userDao.findById(user_id);
        if (byId.isPresent()) {
            return (User) byId.get();
        } else {
            return null;
        }
    }

    /**
     * 存储任务
     *
     * @param relation
     */
    public void save(Relation relation) {
        relationDao.save(relation);
    }

    /**
     * 根据管理员id和任务id查询relation
     */
    public Relation findByAdmin_idAndTask_id(Relation relation) {
        // 假设根据用户ID和任务ID查询
        return relationDao.findByAdmin_idAndTask_id(relation.getAdmin_id(), relation.getTask_id());
    }

    /**
     * 搜索任务
     * @param task
     * @param priceMin
     * @param priceMax
     * @return
     */
    public List<Task> findByTask(Task task, BigDecimal priceMin, BigDecimal priceMax) {

        String school = task.getSchool();
        String taskName = task.getTask_name();
        Integer status = task.getStatus();

        // 将空字符串转换为 null
        if (school != null && school.trim().isEmpty()) {
            school = null;
        }

        // 如果转换后所有条件都为 null，返回空列表或抛出异常
        if (school == null && status == null && priceMin == null &&
                priceMax == null && taskName == null) {
            return Collections.emptyList();
            // 或者 throw new IllegalArgumentException("查询条件不能全部为空");
        }
        task.setSchool(school);
        task.setTask_name(taskName);
        task.setStatus(status);

        return taskDao.findByTask(task.getSchool(),task.getStatus(), priceMin, priceMax,task.getTask_name());
    }

    /**
     * 查询对应的任务
     * @param task
     * @param priceMin
     * @param priceMax
     * @return
     */
    public List<Task> TBFindAll(Task task, BigDecimal priceMin, BigDecimal priceMax) {
        String school = task.getSchool();
        Integer status = task.getStatus();
        String taskName = task.getTask_name();
        String taskContext = task.getTask_context();
        // 构建动态查询条件
        Specification<Task> spec = (Root<Task> root, CriteriaQuery<?> query, CriteriaBuilder cb) -> {
            /**
             *
             * @param root:用于获取元素属性
             * @param query:自定义查询对象
             * @param cb:构建查询对象
             * @return
             */
            Predicate predicate = cb.conjunction();

            // 学校名称条件
            if (school != null && !school.isEmpty()) {
                predicate = cb.and(predicate, cb.like(root.get("school"), "%" + school + "%"));
            }

            // 奖励范围条件 - 最小奖励
            if (priceMin != null) {
                predicate = cb.and(predicate, cb.greaterThanOrEqualTo(root.get("reward"), priceMin));
            }

            // 奖励范围条件 - 最大奖励
            if (priceMax != null) {
                predicate = cb.and(predicate, cb.lessThanOrEqualTo(root.get("reward"), priceMax));
            }

            // 任务状态条件 (-1表示不筛选)
            if (status != null && status != -1) {
                predicate = cb.and(predicate, cb.equal(root.get("status"), status));
            }

            // 关键词搜索（标题或描述包含关键词）
            if (taskName != null && !taskName.isEmpty()) {
                Predicate keywordPredicate = cb.or(
                        cb.like(root.get("taskName"), "%" + taskName + "%"),
                        cb.like(root.get("taskContext"), "%" + taskContext + "%")
                );
                predicate = cb.and(predicate, keywordPredicate);
            }

            // 添加排序：按发布时间倒序
//            query.orderBy(cb.desc(root.get("publishTime")));

            return predicate;
        };

        // 执行查询并返回结果
        List<Task> taskList = xsdService.MyFindAll(spec);
        return taskList;
    }
//
//
//    /**
//     * 根据user_id查找对应的task
//     *
//     * @param user_id
//     * @return
//     */
//    public List<Relation> findByUser_idRelation(Integer user_id) {
//        return relationDao.findByUser_idRelation(user_id);
//    }
//
//    /**
//     * 根据任务id查询对应的任务（列表）
//     * @param taskIds
//     * @return
//     */
//    public List<Task> findByIds(List<Integer> taskIds) {
//        return taskDao.findByIdIn(taskIds);
//    }
//
//    /**
//     * 根据条件搜索
//     * @param school
//     * @param status
//     * @param priceMax
//     * @param priceMin
//     * @param words
//     * @return
//     */
//    @Transactional(readOnly = true)  // 添加事务注解
//    public List<Task> myFind(String school, Integer status, BigDecimal  priceMin, BigDecimal  priceMax, String words) {
//
//        return taskDao.myFind(school,status,priceMin,priceMax,words);
//
//    }
    //
//    /**
//     * 添加新任务
//     *
//     * @param task
//     */
//    public void saveTask(Task task) {
//        taskDao.save(task);
//    }
//
//
//    /**
//     * 删除任务
//     *
//     * @param
//     */
//    public void deleteTask(Integer id) {
//        taskDao.deleteById(id);
//    }
//
//
}
